package com.res.share.common.seo.translate;


import com.alibaba.fastjson.JSONArray;
import com.res.share.common.utils.RegularUtil;
import org.apache.commons.lang.StringUtils;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URLEncoder;

/**
 * 第一种方式
 * https://github.com/timeday/Google_TK
 */
public class GoogleApi {

    //private static final String PATH = "/static/js/gettk.js";
    private static final String PATH = "/static/js/get-tk.js";

    static ScriptEngine engine = null;

    private Browser browser = null;

    static {
        ScriptEngineManager maneger = new ScriptEngineManager();
        engine = maneger.getEngineByName("javascript");
        FileInputStream fileInputStream = null;
        Reader scriptReader = null;

        try {
            scriptReader = new InputStreamReader(GoogleApi.class.getResourceAsStream(PATH), "utf-8");
            engine.eval(scriptReader);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (scriptReader != null) {
                try {
                    scriptReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public GoogleApi() {
        this.browser = new Browser();
    }

    public GoogleApi(String ip, Integer port) {
        this.browser = new Browser();
        this.browser.setProxy(ip, port);
    }

    public String getTKK() throws Exception {
        browser.setUrl("https://translate.google.cn/");

        try {
            String result = browser.executeGet();
            if (StringUtils.isNotBlank(result)) {
                if (result.indexOf("tkk") > -1) {
                    String matchString = RegularUtil.findMatchString(result, "tkk:.*?',");
                    String tkk = matchString.substring(5, matchString.length() - 2);
                    return tkk;
                }
            }
        } catch (Exception e) {
            throw new RuntimeException("获取 tkk 出错");
        }

        return null;
    }

    public static String getTK(String word, String tkk) {
        String result = null;

        try {
            if (engine instanceof Invocable) {
                Invocable invocable = (Invocable) engine;
                result = (String) invocable.invokeFunction("tk", new Object[]{word, tkk});
            }
        } catch (Exception e) {
            throw new RuntimeException("获取 tk 出错");
        }

        return result;
    }

    public static String getTKOne(String word) {
        String result = null;

        try {
            if (engine instanceof Invocable) {
                Invocable invocable = (Invocable) engine;
                result = (String) invocable.invokeFunction("tk", word);
            }
        } catch (Exception e) {
            throw new RuntimeException("获取 tk 出错");
        }

        return result;
    }

    public String translatePost(String word, String from, String to){
        if (StringUtils.isBlank(word)) {
            return null;
        }
        StringBuffer rBuffer = new StringBuffer();

        //String tk = getTK(word, tkk);
        String tk = getTKOne(word);

        try {
            word = URLEncoder.encode(word, "UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        StringBuffer buffer = new StringBuffer();
        if (StringUtils.isBlank(from)) {
            from = "auto";
        }
        buffer.append("client=t");
        buffer.append("&sl="+ from);
        buffer.append("&tl="+to);
        buffer.append("&hl=zh-CN");
        buffer.append("&dt=at");
        buffer.append("&dt=bd");
        buffer.append("&dt=ex");
        buffer.append("&dt=ld");
        buffer.append("&dt=md");
        buffer.append("&dt=qca");
        buffer.append("&dt=rw");
        buffer.append("&dt=rm");
        buffer.append("&dt=ss");
        buffer.append("&dt=t");
        buffer.append("&ie=UTF-8");
        buffer.append("&oe=UTF-8");
        buffer.append("&source=btn");
        buffer.append("&ssel=0");
        buffer.append("&tsel=0");
        buffer.append("&kc=0");
        buffer.append("&tk="+tk);
        buffer.append("&q="+word);
        browser.setUrl("https://translate.googleapis.com/translate_a/single");
        try {
            String result = browser.executePost(buffer.toString());
            JSONArray array = (JSONArray) JSONArray.parse(result);
            JSONArray rArray = array.getJSONArray(0);

            for (int i = 0; i < rArray.size(); i++) {
                String r = rArray.getJSONArray(i).getString(0);
                if (StringUtils.isNotBlank(r)) {
                    rBuffer.append(r);
                }
            }
        } catch (Exception e) {
            throw new RuntimeException("结果集解析出错");
        }
        return rBuffer.toString();
    }

    public String translateGet(String word, String from, String to) {
        if (StringUtils.isBlank(word)) {
            return null;
        }
        StringBuffer rBuffer = new StringBuffer();
        /*String tkk = getTKK();

        if (StringUtils.isBlank(tkk)) {
            throw new RuntimeException("无法获取 tkk");
        }*/

        //String tk = getTK(word, tkk);
        String tk = getTKOne(word);

        try {
            word = URLEncoder.encode(word, "UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }

        StringBuffer buffer = new StringBuffer("https://translate.googleapis.com/translate_a/single?client=t");

        if (StringUtils.isBlank(from)) {
            from = "auto";
        }

        buffer.append("client=t");
        buffer.append("&sl=" + from);
        buffer.append("&tl=" + to);
        buffer.append("&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&source=btn&kc=0");
        buffer.append("&tk=" + tk);
        buffer.append("&q=" + word);
        browser.setUrl(buffer.toString());

        try {
            String result = browser.executeGet();
            JSONArray array = (JSONArray) JSONArray.parse(result);
            JSONArray rArray = array.getJSONArray(0);

            for (int i = 0; i < rArray.size(); i++) {
                String r = rArray.getJSONArray(i).getString(0);
                if (StringUtils.isNotBlank(r)) {
                    rBuffer.append(r);
                }
            }
        } catch (Exception e) {
            throw new RuntimeException("结果集解析出错");
        }
        return rBuffer.toString();
    }



    public static void main(String[] args) throws Exception {
        GoogleApi googleApi=new GoogleApi();
                String txt="在喊出“今年相机部门有没有年终奖，就看能不能干翻华为”之后，小米董事长雷军又发新手机了，这一次是在故宫。\n" +
                        "\n" +
                        "2018年10月25日，在故宫发布磁动力滑盖手机MIX3乾清宫户外发布会，雷军在现场有点激动，一个人solo了将近一个半小时。雷军在介绍手机后置相机时，突然天空中传来两声乌鸦叫，雷军忍不住笑场，说连鸟都在肯定小米手机，“这是我们第一次办的户外的发布会，还这么有趣啊。”\n" +
                        "\n" +
                        "25日早间，小米集团发布公告称，预计到10月底，手机出货量将突破1亿台，提前两个月完成2018年全年目标。\n" +
                        "\n" +
                        "雷军在发布会上谈到，今年手机大厂商和小厂商之间的差距会拉大，主要原因是各家在相机、AI方面投入成本不同所致。今年5月，雷军在内部信中宣布，在手机部内成立单独的相机部，集中全公司优势资源，提升小米手机的拍照品质。\n" +
                        "\n" +
                        "雷军曾对相机部门的同事说，今年相机部门有没有年终奖，就看能不能干翻华为。25日下午更新了最新成绩，小米MiX3以103的成绩超过了华为P20。\n" +
                        "\n" +
                        "小米如何“干翻”华为呢？\n" +
                        "\n" +
                        "▲MIX3故宫乌鸦捣乱小米发布会现场 雷军笑场：连鸟都肯定了\n" +
                        "\n" +
                        "未来高增速或不靠手机靠IoT\n" +
                        "\n" +
                        "新京报：小米过去8年保持了高速的增长，未来还能有非常高的增速吗？\n" +
                        "\n" +
                        "雷军：我们对小米未来的高速增长很有信心。首先手机行业是一个很大的市场，2017年全球共销售手机14.7亿台，小米销售了9000多万台。随着5G时代的到来，手机市场可能再次迎来增长，虽然不会像过去增长那么快了，但这个市场即便不再增长，对于小米来说仍然有巨大的成长空间。\n" +
                        "\n" +
                        "其次，手机之外，小米在智能硬件和消费升级领域布局广泛，已经进入了100多个品类，建成了全球最大的IoT物联网平台。随着AI时代的来临，AI+IoT将产生巨大的价值，小米已经具备了一些优势。\n" +
                        "\n" +
                        "另外，小米在海外市场有巨大的机遇。小米手机已经进入了74个国家和地区，还有很多市场有待进入，我们的很多品类也还没有进入全球市场。随着小米一步一步进入新的市场，把新的市场做好，我觉得小米未来还有十倍以上的成长空间。\n" +
                        "\n" +
                        "新京报：我们注意到小米还在布局智能家居。有观点认为智能家居是个伪命题？你怎么看这个问题？\n" +
                        "\n" +
                        "雷军：“智能家居”不是一个新词，二十年前在国外就有了，只是一直没有推动。我们觉得背后主要原因是商业通道和技术通道没有打通，比如以前智能家居的成本非常高，家里必须重新装修一遍，这对消费者难以负担，此外，不同厂家的产品之间也很难互联互通。\n" +
                        "\n" +
                        "小米做了两件事情来解决，首先我们把一个个的产品智能化了，消费者买回家后，突然发现实现了智能家居，这是商业通道理顺了。另外，我们做了互联互通的模组，在技术上也打通了，小米智能家居产品由很多不同的公司生产，但只要用了这个模组就可以互联互通。\n" +
                        "\n" +
                        "智能家居目前只是刚起步，小米也只是刚跨过门槛，今后智能家居的发展空间可能远超我们想像。\n" +
                        "\n" +
                        "新京报：有人说，小米生态产品只是在做微创新，你怎么看这个问题？\n" +
                        "\n" +
                        "雷军：从我们创业的经验来看，成功背后都有不为人知的艰辛，哪怕是一点点成绩，都要付出巨大的努力。所以我觉得我们不要小看微创新，为了提升消费者的体验，哪怕仅仅是1%，我们也投入了100%的精力。\n" +
                        "\n" +
                        "小米立志要成为一家伟大的互联网公司，让全球每个人都享受科技带来的美好生我没有。我们只有全力以赴做好每一件小事，才是走在正确的道路上。\n" +
                        "\n" +
                        "下一个互联网浪潮是人工智能\n" +
                        "\n" +
                        "新京报：如何看待互联网这20年来在中国的发展，如果用几个关键的时间点来划分，你会怎么划分？\n" +
                        "\n" +
                        "雷军：我觉得2007年苹果推出iPhone是个很重要的事件，智能手机的出现极大的改变了互联网，我判断手机会逐渐替代个人电脑，移动互联网的时代将会来临。2010年小米成立，2011年推出了第一代小米手机，我们推动了智能手机在中国的快速普及和品质提升，移动支付、电商、社交网络、短视频等行业在中国的蓬勃发展，都有赖于庞大的移动互联网人口，这方面小米做了一点贡献。\n" +
                        "\n" +
                        "新京报：互联网下一个浪潮会是什么？在这个浪潮下，小米的机会是什么？\n" +
                        "\n" +
                        "雷军：人工智能的时代已经到来了，人工智能也是小米最重要的战略，我们拥有四项巨大的优势，用户群、海量设备、海量的数据、对整个AI时代的认知，很早就重视了云服务和大数据。\n" +
                        "\n" +
                        "小米选择的突破口是IoT，也就是万物互联，我认为AI与IoT结合将形成AIoT，也就是万物智慧互联，在这个领域未来有着巨大的发展空间。小米已经建成了全球最大的消费物联网，连接了1.15亿台智能设备（不包含手机、平板和笔记本电脑），小米人工智能助理小爱同学月活跃设备超3000万，月唤醒计数超10亿次，累计唤醒次数超50亿次。\n" +
                        "\n" +
                        "“天使投资人经历让我学会找风口”\n" +
                        "\n" +
                        "新京报：从金山时代开始，业界对你的评价就是IT劳模，怎么看待这一评价？\n" +
                        "\n" +
                        "雷军：如果我们要实现与众不同的梦想，付出的不比别人多，怎么可能成功呢？我现在还是这样认为，创业并不光鲜，成功的企业家也不像大家想的，轻轻松松就成功了，哪怕一点点成绩，背后都要付出极大的努力。在成功的路上，其实只有这一个秘诀认真拼命地工作。\n" +
                        "\n" +
                        "新京报：天使投资人的身份对于创办小米有哪些帮助？创业者和投资人的思维方式最大的不同之处是什么？\n" +
                        "\n" +
                        "雷军：因为天使投资人做的就是看大势，找风口。我觉得创业要想五年后是什么样子？十年后是什么样子？什么是正确的事情，什么是正确的时间点？\n" +
                        "\n" +
                        "我当年是一个手机发烧友，认为手机上网是未来的趋势，未来10年是移动互联网的天下，那我接着就想应该做些什么？所以我用投资人的身份，去看谁在做移动互联网，去搞清楚移动互联网到底是什么，这个过程中我们越来越坚信移动互联网的未来，最终在2010年决定创办小米。";
        String translate = googleApi.translatePost(txt, "zh_cn","en");
        System.out.println(translate);

        System.out.println("-----------------------------");

        String translateONe = googleApi.translatePost(translate, "en","zh_cn");
        System.out.println(translateONe);
    }
}


